"use strict";

function printUsage() {
  console.log("使用方法:");
  console.log("  node calc.js <数学表达式>");
  console.log("  node calc.js --help 或 -h");
  console.log("");
  console.log("示例:");
  console.log("  node calc.js '2 + 3 * 4'");
  console.log("  node calc.js 'Math.sqrt(16)'");
  console.log("  node calc.js '10 / 2'");
}

function evaluateExpression(expression) {
  try {
    // 使用 Function 构造函数来安全地评估数学表达式
    // 这样可以避免使用 eval，但仍然允许基本的数学运算
    const allowedChars = /^[0-9+\-*/().\s,Math\s\w]*$/;
    if (!allowedChars.test(expression)) {
      throw new Error("表达式包含不允许的字符");
    }
    
    // 创建一个安全的评估函数
    const func = new Function('Math', 'return ' + expression);
    const result = func(Math);
    
    return result;
  } catch (error) {
    throw new Error(`无效的数学表达式: ${error.message}`);
  }
}

// 获取命令行参数
const args = process.argv.slice(2);

// 检查参数数量
if (args.length === 0) {
  console.log("错误: 缺少数学表达式参数");
  console.log("");
  printUsage();
  process.exit(1);
}

// 检查帮助参数
if (args[0] === '--help' || args[0] === '-h') {
  printUsage();
  process.exit(0);
}

// 如果参数多于3个，忽略多余的参数
if (args.length > 3) {
  console.log("警告: 参数过多，忽略多余的参数");
}

// 获取数学表达式（取前3个参数并用空格连接）
const expression = args.slice(0, 3).join(' ');

try {
  const result = evaluateExpression(expression);
  console.log(`表达式: ${expression}`);
  console.log(`结果: ${result}`);
} catch (error) {
  console.log(`错误: ${error.message}`);
  console.log("");
  printUsage();
  process.exit(1);
}
